博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
djagon实战form数据库等操作
阅读量:6433 次
发布时间:2019-06-23

本文共 7710 字,大约阅读时间需要 25 分钟。

实例项目

项目需求分析

通过form表单的方式,来实现以下几个功能

1、html标签的自动生成
2、上次输入数据的保留
3、输入数据的验证

代码实施

数据库代码

from django.db import modelsclass Classes(models.Model):    title = models.CharField(max_length=32)class Student(models.Model):    sname = models.CharField(max_length=32)    email = models.CharField(max_length=32)    age = models.IntegerField()    cls = models.ForeignKey('Classes',on_delete=models.CASCADE)class Teacher(models.Model):    tname = models.CharField(max_length=32)    c2t = models.ManyToManyField('Classes')

数据库报错'on_delete'

Djiango的时候发现执行mange.py makemigrations 和 migrate是会报错,少位置参数on_delete,查了一下是因为指定外键的方式不对,改一下就OK了。

一对多设计 多方持有一方的外键
所以解决方法是:

cls = models.ForeignKey('Classes')添加字段变成cls = models.ForeignKey('Classes',on_delete=models.CASCADE)

班级管理

由于不小心把django升级到了2.0版本,在做路由的时候发现出现了问题,下面有记录。2.0是咱们为python3.x出的,先用用看

班级管理功能:
1、班级的列表
2、班级的增加
3、班级的编辑

班级的路由url

from django.contrib import adminfrom django.urls import path,re_pathfrom clsmanagent import viewsfrom django.conf.urls import urlurlpatterns = [    path('class_list/', views.class_list),    path('add_class/', views.add_class),    path('edit_class/
/', views.edit_class),

班级管理列表

视图文件py

from django.shortcuts import render,redirect,HttpResponsefrom django.forms import Form, fields,widgetsfrom clsmanagent import models# 班级form验证class ClassForm(Form):    title = fields.RegexField('全栈\d+',label='班级名称')# 班级信息def class_list(request):    # if request.method == "GET":    obj = models.Classes.objects.all()    return render(request, 'classlist.html', {'obj': obj})

班级的列表的html文件

班级列表


添加班级{#
#}{# {% csrf_token %}#}
    {% for cls_list in obj %}
  • {
    { cls_list.title }}编辑
  • {% endfor %}
{#
#}

班级增加功能

增加功能视图文件

#添加班级def add_class(request):    if request.method == "GET":        obj = ClassForm()        return render(request,'addclass.html',{'obj':obj})    else:        obj = ClassForm(request.POST)        if obj.is_valid():            models.Classes.objects.create(**obj.cleaned_data)            return redirect('/class_list/')        return render(request, 'addclass.html', {'obj': obj})

增加班级的html代码

{% csrf_token %}

{# {

{ obj.as_p }}#} {
{ obj.title }} {
{ obj.errors.title.0 }}

编辑班级

编辑班级视图文件

def edit_class(request,nid):    if request.method == "GET":        cls_info = models.Classes.objects.filter(id=nid).first()        print(cls_info)        obj = ClassForm(initial={'title':cls_info.title})        return render(request,'editclass.html',{'obj':obj,'nid':nid})    else:        obj = ClassForm(request.POST)        if obj.is_valid():            models.Classes.objects.filter(id=nid).update(**obj.cleaned_data)            return redirect('/class_list/')        return render(request,'editclass.html',{'obj':obj,'nid':nid})

编辑班级的html代码

    

编辑班级


{% csrf_token %}

{

{ obj.title }}{
{ obj.errors.title.0 }}

学生表功能

功能和班级功能一样,这里就把视图函数全部放到一起

#学生列表def student_list(request):    stu_list = models.Student.objects.all()    return render(request,'studentlist.html',{'stu_list':stu_list})#添加学生##创建学生的Form条件验证class StuForm(Form):    sname = fields.CharField(min_length=2,max_length=6,label='学生姓名')    email = fields.EmailField()    age = fields.IntegerField()    cls_id = fields.IntegerField(        widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))#把班级变成下拉框,这里django会自动给我们记录select的value,不需要我们自己来操心    )def add_stu(request):    if request.method == "GET":        obj = StuForm()        return render(request,'addstudent.html',{'obj':obj})    else:        obj = StuForm(request.POST)        if obj.is_valid():            models.Student.objects.create(**obj.cleaned_data)            return redirect('/student_list/')        return render(request,'addstudent.html',{'obj':obj})#编辑学生def edit_stu(request,nid):    if request.method == "GET":        row = models.Student.objects.filter(id=nid).values('sname','email','age','cls_id').first()#让他变成字典的类型可以传参到下面的form里面,因为我们知道表达里面的data和initial后面都是一个字典类型        obj = StuForm(row)        return render(request,'editstudent.html',{'obj':obj,'nid':nid})    else:        obj = StuForm(request.POST)        if obj.is_valid():            models.Student.objects.filter(id=nid).update(**obj.cleaned_data)#参数我一个字典            return redirect('/student_list/')        return render(request,'editstudent.html',{'obj':obj,'nid':nid})

学生列表html代码

学生列表


添加学生
    {% for stu in stu_list %}
  • {
    { stu.sname }}-{
    { stu.age }}-{
    { stu.email }}-{
    { stu.cls_id }}编辑
  • {% endfor %}

增加学生html代码

{% csrf_token %}

添加学生


{

{ obj.sname }}{
{ obj.errors.sname.0 }}

{

{ obj.email }}{
{ obj.errors.email.0 }}

{

{ obj.age }}{
{ obj.errors.age.0 }}

{

{ obj.cls_id }}{
{ obj.errors.cls_id.0 }}

编辑学生html代码

编辑学生信息


{% csrf_token %}

{

{ obj.sname }}

{

{ obj.email }}

{

{ obj.age }}

{

{ obj.cls_id }}

下面是多对多的操作

添加老师

老师列表html

    
老师列表

添加老师

{% for foo in teach_list %}
{% endfor %}
ID 老师姓名 任教班级
{
{ foo.id }}
{
{ foo.tname }}
{
{ foo.c2t.all }}

添加老师html代码

{% csrf_token %}

姓名:{

{ obj.tname }}

任教班级:{

{ obj.xx }}

添加老师和老师列表逻辑代码

def teacher_list(request):    if request.method == "GET":        teach_list = models.Teacher.objects.all()        return render(request,'teacher.html',{'teach_list':teach_list})class TeachForm(Form):    tname = fields.CharField(min_length=2)    xx = fields.CharField(        widget=widgets.SelectMultiple(choices=models.Classes.objects.values_list('id','title'))    )    #上面这个显示的结果是可以多选,但是clean_data的数据都是字符串格式,对于取值是很麻烦的        要想使用正确的多选框要使用下面的方式            xx = fields.MultipleChoiceField(        choices=models.Classes.objects.values_list('id', 'title'),        widget=widgets.SelectMultiple()    )    # xx = fields.CharField(    #     widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))    # )#这样显示出来的是一个单选的下拉框格式def add_teacher(request):    if request.method == "GET":        obj = TeachForm()        return render(request,'addteacher.html',{'obj':obj})     else:        obj = TeachForm(request.POST)        if obj.is_valid():            # models.Teacher.objects.create(tname=obj.cleaned_data['tname'])第一种方法,但是对于字段多来说不好用            niubi = obj.cleaned_data.pop('xx')            row = models.Teacher.objects.create(**obj.cleaned_data)            row.c2t.add(*niubi)            return redirect('/teacher/')        return render(request,'addteacher.html',{'obj':obj})

djagon实战form数据库等操作

urls故障

django2.0版本主要更新了urls,url变成了path,在使用r'^edit_class/(\d+)/', views.edit_class), 路由的时候,发现报错404不能找到路径。经过查看文档发现2.0v版本以后url变成了path,而path的规则变成了如下:

    {% for cls_list in obj %}
  • {
    { cls_list.title }}编辑
  • {% endfor %}
from django.urls import pathfrom . import viewsurlpatterns = [     path('edit_class/
/', views.edit_class),]

这里把传入的参数会变成指定的,不需要(\d+/)了,

转换格式类型说明Str匹配除分隔符(/)外的非空字符,默认类型
等价于
Int匹配0和正整数Slug匹配字母、数字、横杠、下划线组成的字符串,str的子集Uuid匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00path匹配任何非空字符串,包括路径分隔符,是全集

单选框的方法

djagon实战form数据库等操作

转载于:https://blog.51cto.com/sgk2011/2083831

你可能感兴趣的文章
浅谈 OneAPM 在 express 项目中的实践
查看>>
kubernetes节点选择器
查看>>
Sublime Text 3初体验
查看>>
快速排序&归并排序
查看>>
将字符串转换成二维码
查看>>
AsyncTask的小分析
查看>>
使用Redis实现关注关系
查看>>
Go抓取网页数据并存入MySQL和返回json数据<三>
查看>>
MySQL复制介绍及搭建
查看>>
Java在线调试工具
查看>>
[译]CSS-理解百分比的background-position
查看>>
虚拟机安装CentOS
查看>>
Idea里面老版本MapReduce设置FileInputFormat参数格式变化
查看>>
在 win10 环境下,设置自己写的 程序 开机自动 启动的方法
查看>>
Unity3d游戏开发之-单例设计模式-多线程一
查看>>
通过jquery定位元素
查看>>
Tooltip表单验证的注册表单
查看>>
UWP开发中两种网络图片缓存方法
查看>>
超8千Star,火遍Github的Python反直觉案例集!
查看>>
【msdn wpf forum翻译】如何在wpf程序(程序激活时)中捕获所有的键盘输入,而不管哪个元素获得焦点?...
查看>>